#ifndef __COMMON_XMLOP_H__
#define __COMMON_XMLOP_H__

#ifdef __cplusplus
extern "C" {
#endif


/**
 * xmlop
 *
 * 一组简化的获取配置项的值的方法。
 * 当前不支持获取属性的值（待补充）。
 */

typedef struct xmlop_data *xmlop_t;

typedef struct pugi_xmlop_data *pugi_xmlop_t;

/**
 * 打开xml文件
 *
 * 参数：
 * filepath：xml文件路径。
 *
 * 返回值：
 * NULL：失败
 * non-NULL：成功，xmlop_t类型。
 */
xmlop_t xmlop_open(const char *filepath);

pugi_xmlop_t pugi_xmlop_open(const char *filepath);

/**
 * 关闭打开的xml
 *
 * 参数：
 * x：xmlop_open的返回值
 *
 * 返回值：
 * 无
 */
void xmlop_close(xmlop_t x);

void pugi_xmlop_close(pugi_xmlop_t x);

/**
 * 获取xml的配置值。
 *
 * 参数：
 * x：xmlop_open的返回值
 * 其他：配置项在xml节点里面的路径。
 *
 * 返回值：
 * NULL：失败
 * non-NULL：成功，配置值的字符串指针。
 */
const char *xmlop_get(xmlop_t x, ...);

void *xmlop_get_elm(xmlop_t x, ...);

const char *pugi_xmlop_get(pugi_xmlop_t x, ...);

void *pugi_xmlop_get_elm(pugi_xmlop_t x, ...);

/**
 * 获取xml的配置项。主要用于多个配置的路径相同的情况。
 *
 * 参数：
 * x：xmlop_open的返回值
 * prev：上一次xmlop_get_next的返回值，第一次执行，prev值为NULL。
 * 其他：配置项在xml节点里面的路径。
 *
 * 返回值：
 * NULL：失败，没有更多的配置值了。
 * non-NULL：成功，获取配置的元素。
 */
void *xmlop_get_next(xmlop_t x, void *prev, ...);

void *pugi_xmlop_get_next(pugi_xmlop_t x, void *prev, ...);

/**
 * 获取配置项关联的字符串。
 *
 * 参数
 * x：xmlop_open的返回值
 * element：xmlop_get_next的返回值。
 *
 * 返回值：
 * NULL：失败，配置项没有值。
 * non-NULL；成功，配置项的字符串。
 */
const char *xmlop_get_text(xmlop_t x, void *element); 

const char *xmlop_get_attr(xmlop_t x, void *element, const char *attr);

const char *pugi_xmlop_get_text(pugi_xmlop_t x, void *element); 

const char *pugi_xmlop_get_attr(pugi_xmlop_t x, void *element, const char *attr);

/**
 * 获取xml 某个elm的子elm
 *
 * 参数：
 * x：xmlop_open的返回值
 * elm：当前父elm
 * sub_elm_name：子elm 的名字
 *
 * 返回值：
 * NULL：失败，没有更多的配置值了。
 * non-NULL：成功，获取配置的元素。
 */
void *xmlop_get_sub_elm(xmlop_t x, void * elm, const char * sub_elm_name);

void *xmlop_get_sub_next(xmlop_t x, void *sub, void *prev);

void *pugi_xmlop_get_sub_elm(pugi_xmlop_t x, void * elm, const char * sub_elm_name);

void *pugi_xmlop_get_sub_next(pugi_xmlop_t x, void *sub, void *prev);

/**
 * pugi通过xpath获取xml的配置项。单个元素节点
 *
 * 参数：
 * x： pugi_xmlop_open的返回值
 * path：xpath的路径,以“/”开头和分割
 *              "/ruleFile/globalDef/configs/section[@name='engine']"，表示按照路径搜索对应元素节点且属性name = engine的节点
 *              "/ruleFile/globalDef/configs/section[@name='engine' and @filename="test"]" 支持多属性查找
 * 
 * 返回值：
 * NULL：失败，没有更多的配置值了。
 * non-NULL：成功，获取配置的元素属性值。
 */
char *pugi_xpath_get_text(pugi_xmlop_t x, const char *path);

uint32_t xmlop_xpath_get_text_batch(pugi_xmlop_t x, const char *path, char **result, uint32_t node_num);

uint32_t xmlop_xpath_get_attr_batch(pugi_xmlop_t x, const char *path, const char *attr, char **result, uint32_t node_num);

#ifdef __cplusplus
}
#endif

#endif

